#include "util.h"

namespace util
{
	vec2 v2gen(float x, float y)
	{
		vec2 v;
		v.x = x;
		v.y = y;
		return v;
	}
	vec3 v3gen(float x, float y, float z)
	{
		vec3 v;
		v.x = x;
		v.y = y;
		v.z = z;
		return v;
	}
	vec3 v3add(const vec3& a, const vec3& b)
	{
		return v3gen(a.x + b.x, a.y + b.y, a.z + b.z);
	}
	vec3 v3sub(const vec3& a, const vec3& b)
	{
		return v3gen(a.x - b.x, a.y - b.y, a.z - b.z);
	}
	vec3 v3mul(const vec3& v, float f)
	{
		return v3gen(v.x * f, v.y * f, v.z * f);
	}
//	vec3 v3build(const vec3* from, const vec3* to)
//	{
//		return v3gen(to->x - from->x, to->y - from->y, to->z - from->z);
//	}
	vec3 v3cross(const vec3& a, const vec3& b)
	{
		vec3 r;
		r.x = a.y * b.z - a.z * b.y;
		r.y = a.z * b.x - a.x * b.z;
		r.z = a.x * b.y - a.y * b.x;
		return r;
	}
	float v3dot(const vec3& a, const vec3& b)
	{
		return a.x * b.x + a.y * b.y + a.z * b.z;
	}
	float v3len(const vec3& v)
	{
		return sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
	}
	vec3 v3nor(const vec3& v)
	{
		float len;
		vec3 r = v;   // make a copy
		len = v3len(v);
		if (len != 0) {
			float f = 1 / len;
			r.x *= f;
			r.y *= f;
			r.z *= f;
		}
		return r;
	}
	vec3 v3rotY(const vec3& v, float ang)
	{
		if (ang == 0.0f)   return v;
		
		float s = sinf(PI * ang / 180.0f);
		float c = cosf(PI * ang / 180.0f);
		return v3gen(v.x * c + v.z * s, v.y, -v.x * s + v.z * c);
	}
	vec3 v3rotZ(const vec3& v, float ang)
	{
		if (ang == 0.0f)   return v;   // return the copy of v
		
		float s = sinf(PI * ang / 180.0f);
		float c = cosf(PI * ang / 180.0f);
		return v3gen(v.x * c - v.y * s, v.x * s + v.y * c, v.z);
	}
	color c4gen(float r, float g, float b, float a)
	{
		color rc;
		rc.c[0] = r;
		rc.c[1] = g;
		rc.c[2] = b;
		rc.c[3] = a;
		return rc;
	}
}